#include <QDebug>

#include <QTableWidgetItem>

#include "qlspluginsmanagertablewidget.h"
#include "ui_qlspluginsmanagertablewidget.h"

QLsPluginsManagerTableWidget::QLsPluginsManagerTableWidget(QWidget *parent) :
	QWidget(parent),
	ui(new Ui::QLsPluginsManagerTableWidget),
	m_isShowPluginsManagerWidget(false)
{
	ui->setupUi(this);

	ui->tableWidget->setColumnCount(3);																	/* 3列 */
	ui->tableWidget->horizontalHeader()->setVisible(false);												/* 隐藏行表头 */
	ui->tableWidget->verticalHeader()->setVisible(false);												/* 隐藏列表头 */
	/* 样式 */
	ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);								/* 设置不可编辑 */
	ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);								/* 单个选中 */
	ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection);									/* 不可选中 */
	ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);					/* 自动列宽并等宽 */
//	ui->tableWidget->setAlternatingRowColors(true);														/* 交替颜色 */
//	ui->tableWidget->setShowGrid(false);																/* 不显示网格 */
	ui->tableWidget->setMouseTracking(true);
}

QLsPluginsManagerTableWidget::~QLsPluginsManagerTableWidget()
{
	/* 清空表格数据 */
	foreach (PluginInfoPos info, m_pluginInfoPosList)
	{
		/* 删除表格中的数据 */
		ui->tableWidget->removeCellWidget(info.m_pos.x(), info.m_pos.y());
		delete(ui->tableWidget->item(info.m_pos.x(), info.m_pos.y()));
		ui->tableWidget->setItem(info.m_pos.x(), info.m_pos.y(), nullptr);

		/* 从列表中移除 */
		m_pluginInfoPosList.removeOne(info);
	}

	delete ui;
}

/* 添加插件界面 */
void QLsPluginsManagerTableWidget::AddPluginWidget(const PluginInfo &pluginInfo)
{
	/* 校验 */
	if(IsAlreadyExisted(pluginInfo)) return;

	/* 创建插件界面并写入数据 */
	QlsPluginWidget *pluginWidget = new QlsPluginWidget;
	connect(pluginWidget, &QlsPluginWidget::sigLoad, this, &QLsPluginsManagerTableWidget::slotLoad);

	pluginWidget->setPluginInfo(pluginInfo);

	/* 获取空格位置 */
	QPoint pos = GetSpacePos();

	/* 加入空格数据 */
	QTableWidgetItem *item = new QTableWidgetItem;
	ui->tableWidget->setItem(pos.x(), pos.y(), item);
	ui->tableWidget->setCellWidget(pos.x(), pos.y(), pluginWidget);
	m_pluginInfoPosList.append(PluginInfoPos(pluginInfo, pos));
}

/* 删除插件界面 */
void QLsPluginsManagerTableWidget::DeletePluginWidget(const PluginInfo &pluginInfo)
{
	/* 校验 */
	if(!IsAlreadyExisted(pluginInfo)) return;

	/* 移除 */
	foreach (PluginInfoPos info, m_pluginInfoPosList)
	{
		if(info.m_pluginInfo == pluginInfo)
		{
			/* 删除表格中的数据 */
			ui->tableWidget->removeCellWidget(info.m_pos.x(), info.m_pos.y());
			delete(ui->tableWidget->item(info.m_pos.x(), info.m_pos.y()));
			ui->tableWidget->setItem(info.m_pos.x(), info.m_pos.y(), nullptr);

			/* 从列表中移除 */
			m_pluginInfoPosList.removeOne(info);
			break;
		}
	}
}

/* 转发所有插件的加载信号的槽函数 */
void QLsPluginsManagerTableWidget::slotLoad(PluginInfo &pluginInfo)
{
	emit sigLoad(pluginInfo);
}

/* 加载结果的槽函数 */
void QLsPluginsManagerTableWidget::slotLoadRes(PluginInfo &pluginInfo)
{
	/* 找到该插件 */
	foreach (PluginInfoPos info, m_pluginInfoPosList)
	{
		if(info.m_pluginInfo == pluginInfo)
		{
			QlsPluginWidget *pluginWidget = (QlsPluginWidget *)ui->tableWidget->cellWidget(info.m_pos.x(), info.m_pos.y());
			pluginWidget->setPluginInfo(pluginInfo);
			return;
		}
	}

	/* 如果找不到，就添加 */
	AddPluginWidget(pluginInfo);
}

/* 获取当前表格靠前的空格(未添加或被删除导致的空格)位置 */
QPoint QLsPluginsManagerTableWidget::GetSpacePos()
{
	QPoint pos;
	int rowCount = ui->tableWidget->rowCount();

	/* 在已有表格中找空格 */
	for(int i = 0; i < rowCount; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			if(!ui->tableWidget->item(i, j))
			{	/* 找到空格 */
				pos.setX(i);
				pos.setY(j);
				return pos;
			}
		}
	}

	/* 如果没找到，则新建行 */
	ui->tableWidget->insertRow(rowCount);
	pos.setX(rowCount);
	pos.setY(0);
	return pos;
}

/* 是否已存在该插件 */
bool QLsPluginsManagerTableWidget::IsAlreadyExisted(const PluginInfo &pluginInfo)
{
	foreach (PluginInfoPos info, m_pluginInfoPosList)
		if(info.m_pluginInfo == pluginInfo) return true;
	return false;
}

/* 是否显示插件管理器界面 */
bool QLsPluginsManagerTableWidget::isShowPluginsManagerWidget() const
{
	return m_isShowPluginsManagerWidget;
}

void QLsPluginsManagerTableWidget::setIsShowPluginsManagerWidget(bool isShowPluginsManagerWidget)
{
	if(m_isShowPluginsManagerWidget == isShowPluginsManagerWidget) return;
	m_isShowPluginsManagerWidget = isShowPluginsManagerWidget;

	/* 显示插件管理器窗口 */
	if(m_isShowPluginsManagerWidget)
	{

	}
	/* 隐藏插件管理器窗口 */
	else
	{

	}
}

PluginInfoPos::PluginInfoPos()
{
}

PluginInfoPos::PluginInfoPos(PluginInfo pluginInfo, QPoint pos) :
	m_pluginInfo(pluginInfo),
	m_pos(pos)
{
}

bool PluginInfoPos::operator ==(const PluginInfoPos &other)
{
	return this->m_pluginInfo == other.m_pluginInfo;
}
